/**
 * 用户认证相关工具函数
 */
import router from '@/router'
import { ElMessage } from 'element-plus'

// 定义自定义事件名称
export const AUTH_EVENTS = {
  LOGIN: 'auth:login',
  LOGOUT: 'auth:logout'
}

/**
 * 发送认证相关事件
 * @param {string} eventName 事件名称
 * @param {object} data 事件数据
 */
export function dispatchAuthEvent(eventName, data = {}) {
  const event = new CustomEvent(eventName, { detail: data })
  window.dispatchEvent(event)
}

/**
 * 检查用户是否已登录
 * @returns {boolean} 是否已登录
 */
export function isLoggedIn() {
  const token = localStorage.getItem('token')
  return !!token
}

/**
 * 检查token是否有效（未过期）
 * 简单检查token是否存在，更复杂的验证在请求拦截器中处理
 * @returns {boolean} token是否有效
 */
export function isTokenValid() {
  const token = localStorage.getItem('token')
  if (!token) return false
  
  try {
    // 简单检查token格式是否正确（JWT格式应该有两个点分隔）
    if (token.split('.').length !== 3) {
      // console.warn('Token格式不正确')
      return false
    }
    
    return true
  } catch (error) {
    // console.error('检查token有效性时出错:', error)
    return false
  }
}

/**
 * 保存当前路径用于登录后重定向
 * @param {string} path 当前路径
 */
export function saveRedirectPath(path) {
  if (!path) {
    path = window.location.hash.substring(1) || '/'
  }
  localStorage.setItem('redirectPath', path)
}

/**
 * 获取登录后的重定向路径
 * @returns {string} 重定向路径
 */
export function getRedirectPath() {
  return localStorage.getItem('redirectPath') || '/'
}

/**
 * 清除重定向路径
 */
export function clearRedirectPath() {
  localStorage.removeItem('redirectPath')
}

/**
 * 清除用户登录信息
 */
export function clearAuthInfo() {
  localStorage.removeItem('token')
  localStorage.removeItem('username')
  localStorage.removeItem('userId')
  localStorage.removeItem('userInfo')
  localStorage.removeItem('isFirstLogin')

  // 清除邮箱相关缓存数据
  clearEmailCache()
}

/**
 * 清除邮箱相关缓存数据
 */
export function clearEmailCache() {
  // 清理通用邮箱缓存
  localStorage.removeItem('userEmails')
  localStorage.removeItem('emailDomains')
  localStorage.removeItem('emailTemplates')
  localStorage.removeItem('emailRecords')
  localStorage.removeItem('lastEmailToken')

  // 清理用户隔离的邮箱缓存
  const keys = Object.keys(localStorage)
  keys.forEach(key => {
    if (key.startsWith('emailDomains_') ||
        key.startsWith('emailTemplates_') ||
        key.startsWith('userEmails_')) {
      localStorage.removeItem(key)
    }
  })

}

/**
 * 检查登录状态，未登录则跳转到登录页
 * @param {boolean} showMessage 是否显示提示消息
 * @returns {boolean} 是否已登录
 */
export function checkAuth(showMessage = true) {
  if (!isLoggedIn()) {
    if (showMessage) {
      ElMessage.warning('请先登录后再访问')
    }
    
    // 保存当前路径
    saveRedirectPath()
    
    // 跳转到登录页
    router.push('/login')
    return false
  }
  
  // 检查token是否有效
  if (!isTokenValid()) {
    if (showMessage) {
      ElMessage.warning('登录已过期，请重新登录')
    }
    
    // 清除无效的登录信息
    clearAuthInfo()
    
    // 保存当前路径
    saveRedirectPath()
    
    // 跳转到登录页
    router.push('/login')
    return false
  }
  
  return true
}

/**
 * 检查是否首次登录需要设置密码
 * @returns {boolean} 是否需要设置密码
 */
export function needSetPassword() {
  return isLoggedIn() && localStorage.getItem('isFirstLogin') === 'true'
}

/**
 * 检查是否有权限访问当前页面，无权限则跳转
 * @param {object} to 目标路由
 * @returns {boolean} 是否有权限
 */
export function checkRouteAuth(to) {
  // 不需要登录的页面
  const publicPages = ['/login', '/register', '/terms-of-service', '/privacy-policy']
  
  if (publicPages.includes(to.path)) {
    return true
  }
  
  // 检查meta中的requiresAuth属性
  const requiresAuth = to.meta.requiresAuth !== false
  
  if (requiresAuth && !isLoggedIn()) {
    saveRedirectPath(to.fullPath)
    ElMessage.warning('请先登录后再访问')
    router.push('/login')
    return false
  }
  
  // 检查token是否有效
  if (requiresAuth && !isTokenValid()) {
    saveRedirectPath(to.fullPath)
    ElMessage.warning('登录已过期，请重新登录')
    clearAuthInfo()
    router.push('/login')
    return false
  }
  
  // 如果是首次登录且不是设置密码页面，则跳转到设置密码页面
  if (needSetPassword() && to.path !== '/set-password') {
    ElMessage.info('请先设置您的密码')
    router.push('/set-password')
    return false
  }
  
  return true
}

/**
 * 登录成功后的处理
 * @param {string} token 登录令牌
 * @param {object} userInfo 用户信息
 * @param {boolean} isFirstLogin 是否首次登录
 */
export function handleLoginSuccess(token, userInfo, isFirstLogin = false) {
  // 保存token和用户信息
  localStorage.setItem('token', token)
  
  if (userInfo) {
    localStorage.setItem('username', userInfo.username || '')
    localStorage.setItem('userId', userInfo.id || '')
    localStorage.setItem('userInfo', JSON.stringify(userInfo))
  }
  
  // 保存是否首次登录标志
  localStorage.setItem('isFirstLogin', isFirstLogin.toString())
  
  // 获取重定向路径
  const redirectPath = getRedirectPath()
  
  // 清除重定向路径
  clearRedirectPath()
  
  // 首次登录需要设置密码
  if (isFirstLogin) {
    router.push('/set-password')
    return
  }
  
  // 重定向到保存的路径或首页
  router.push(redirectPath)
}

/**
 * 退出登录
 * @param {boolean} redirect 是否重定向到登录页
 */
export function logout(redirect = true) {
  clearAuthInfo()
  
  if (redirect) {
    router.push('/login')
  }
}

export default {
  isLoggedIn,
  isTokenValid,
  checkAuth,
  saveRedirectPath,
  getRedirectPath,
  clearRedirectPath,
  clearAuthInfo,
  needSetPassword,
  checkRouteAuth,
  handleLoginSuccess,
  logout
} 